name: Build wheels

on:
  release:
    types: [published]

  # Enable manual run
  workflow_dispatch:

jobs:
  generate-wheels-matrix:
    # Create a matrix of all architectures & versions to build.
    # This enables the next step to run cibuildwheel in parallel.
    # From https://iscinumpy.dev/post/cibuildwheel-2-10-0/#only-210
    name: Generate wheels matrix
    runs-on: ubuntu-latest
    outputs:
      include: ${{ steps.set-matrix.outputs.include }}
    steps:
      - uses: actions/checkout@v3
      - name: Install cibuildwheel
      # Nb. keep cibuildwheel version pin consistent with job below
        run: pipx install cibuildwheel==2.14.0
      - id: set-matrix
        run: |
          MATRIX=$(
            {
              cibuildwheel --print-build-identifiers --platform linux \
              | jq -nRc '{"only": inputs, "os": "ubuntu-latest"}' \
              && cibuildwheel --print-build-identifiers --platform macos \
              | jq -nRc '{"only": inputs, "os": "macos-latest"}' \
              && cibuildwheel --print-build-identifiers --platform windows \
              | jq -nRc '{"only": inputs, "os": "windows-latest"}'
            } | jq -sc
          )
          echo "include=$MATRIX" >> $GITHUB_OUTPUT

  build_wheels:
    name: Build ${{ matrix.only }}
    needs: generate-wheels-matrix
    strategy:
      fail-fast: false
      matrix:
        include: ${{ fromJson(needs.generate-wheels-matrix.outputs.include) }}
    runs-on: ${{ matrix.os }}
    steps:
      - name: Check out the repo
        uses: actions/checkout@v3

      - name: Set up QEMU
        if: runner.os == 'Linux'
        uses: docker/setup-qemu-action@v2
        with:
          platforms: all

      - name: Build wheels
        uses: pypa/cibuildwheel@v2.14.0
        with:
          only: ${{ matrix.only }}

      - uses: actions/upload-artifact@v3
        with:
          path: ./wheelhouse/*.whl
          name: bdist_files

  build_sdist:
    name: Build source distribution
    runs-on: ubuntu-20.04
    steps:
      - name: Check out the repo
        uses: actions/checkout@v3

      - name: Set up Python 3.11
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'

      - name: Build sdist (pep517)
        run: |
          python -m pip install build
          python -m build --sdist
      - name: Upload sdist
        uses: actions/upload-artifact@v3
        with:
          name: sdist_files
          path: dist/*.tar.gz

  publish_wheels:
    permissions:
      id-token: write
    name: Publish wheels on pypi
    needs: [build_wheels, build_sdist]
    runs-on: ubuntu-latest
    if: startsWith(github.ref, 'refs/tags')
    steps:
      - uses: actions/download-artifact@v3
        with:
          name: bdist_files
          path: dist

      - uses: actions/download-artifact@v3
        with:
          name: sdist_files
          path: dist

      - name: Publish package to PyPI
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          user: __token__
          password: ${{ secrets.PYPI_API_TOKEN }}
